﻿using System;

namespace _32._2_面向对象_Action_Func
{
    class Program
    {
        static Do doo;
        static Doo<float> Dfo;

        // Func : Function  方法
        // .net 框架预定义的最朴素的无参有返回值的委托
        // 使用 泛型 参数，提供多达 17 个重载
        // <in T , out TResult > 最后一个永远是 返回值，前面均为参数
        static Func<float > Ffo;
        static Func<float ,string> Ffo_c;
        // Action : 行动 
        // .net 框架定义的最朴素的无参无返回值委托
        // Action 的存在只是为了用户省去自己声明委托的这一步
        //  为了通用，框架也提供 带参数的 Action 委托
        //  Action 使用泛型参数，可以提供多达 16 个参数（写上尖括号，按下 ctrl+shift+space 能够看到 16个泛型参数重载）
        // 包括不带参数的 一共 17 种
        static Action dooo;
        //static Action<int> dot;

        static void Main(string[] args)
        {
            doo = P_Doo;
            doo?.Invoke();

            dooo = P_Doo;
            dooo?.Invoke();

            Dfo = P_DFO;
            float v = Dfo?.Invoke() ?? 0.0f;
            Console.WriteLine($" DFO 返回值 = {v}");

            Ffo = P_DFO;
            float vv = Ffo?.Invoke()??0.0f;
            Console.WriteLine($" FFO 返回值 = {vv}");

            Ffo_c = P_DFO_C;
            string str = Ffo_c?.Invoke(0.66f) ?? "";
            Console.WriteLine($"Ffo_c 返回值 = {str}");

        }

        private static string P_DFO_C(float arg)
        {
            Console.WriteLine($"你输入了 {arg} ");
            return arg.ToString();
        }

        private static float P_DFO()
        {
            Console.WriteLine("我输出的是 0.1f");
            return 0.1F;
        }

        private static void P_Doo()
        {
            Console.WriteLine($"nameof = {nameof(P_Doo)}");
        }
    }

    // 无参无返回值的委托
    public delegate void Do();
    //public delegate void Action();

    // 最朴素的带返回值的委托
    public delegate T Doo<T>();
    // 系统也为我们构建了一个带返回值的委托
    //public delegate T Func<out T>();
}
